// I2SFFTProcessor.h
// 该文件定义了 I2SFFTProcessor 类，用于处理 I2S 数据采集、FFT 分析和频谱归一化。
// 包括初始化、窗函数计算、直流偏移移除和频谱处理等功能。

#ifndef I2S_FFT_PROCESSOR_H
#define I2S_FFT_PROCESSOR_H

#include <Arduino.h>
#include <ArduinoFFT.h>
#include <driver/i2s.h>

class I2SFFTProcessor
{
public:
    // 构造函数，初始化I2S端口
    I2SFFTProcessor(uint16_t sampleCount = 1024, i2s_port_t i2sPort = I2S_NUM_0);

    // 初始化 I2S
    bool initialize();

    // 析构函数
    ~I2SFFTProcessor();

    // ==================== 即时处理接口（无缓冲区） ====================
    // 即时分离左右声道数据 - 不使用任何缓冲区
    bool readI2SData(double *leftBuffer, double *rightBuffer);

    // 即时获取音频频段数据 - 完全无缓冲区，直接FFT分析
    bool getInstantAudioBands(float *bandValues, int bandCount);

    // ==================== 噪声检测接口 ====================
    bool isBufferReady() const;
    bool startNoiseDetection();
    bool updateNoiseDetection();
    float getNoiseLevel();

private:
    uint16_t _sampleCount;
    i2s_port_t _i2sPort;

    // ==================== 私有辅助函数 ====================
    double getSampleFromRaw(int32_t rawData);
};

/**
 * @brief 获取当前节拍信号强度（用于视觉增强）
 * @return float 节拍信号强度 (0.0-beatBoostFactor)
 */
float getCurrentBeatSignal();

/**
 * @brief 节拍检测算法
 * @param bandValues 频段值数组
 * @param bandCount 频段数量
 * @return bool 是否检测到节拍
 */
bool detectBeat(float* bandValues, int bandCount);

/**
 * @brief 计算总体音频能量
 * @param bandValues 频段值数组
 * @param bandCount 频段数量
 * @return float 总体能量值
 */
float calculateTotalEnergy(float* bandValues, int bandCount);

// ==================== 全局函数声明，供LED模块使用 ====================
// 注意：已删除基于固定FFT频段索引的映射函数，改为使用动态频段生成

/**
 * @brief 生成动态频率分布
 * @param frequencies 频率数组
 * @param totalBands 总频段数
 */
void generateDynamicFrequencyBands(float* frequencies, int totalBands);

// ==================== 基于动态频段索引的补偿和阈值函数声明 ====================
/**
 * @brief 根据动态生成的频段索引获取频率补偿系数
 * @param bandIndex 动态生成的频段索引 (0-总频段数)
 * @param totalBands 总频段数
 * @return 频率补偿系数
 */
float getFreqCompensationByBandIndex(int bandIndex, int totalBands);

/**
 * @brief 根据动态生成的频段索引获取噪声阈值
 * @param bandIndex 动态生成的频段索引 (0-总频段数)
 * @param totalBands 总频段数
 * @return 噪声阈值
 */
float getNoiseThresholdByBandIndex(int bandIndex, int totalBands);

#endif // I2S_FFT_PROCESSOR_H